home *** CD-ROM | disk | FTP | other *** search
/ PCMania 64 / PCMania CD64_1.iso / phy / phy001 / graph / graph20.arj / UTIL / SPRITER / SPRITER.ASM next >
Encoding:
Assembly Source File  |  1996-07-19  |  11.1 KB  |  305 lines

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;;;;;;;;;;;;;;;;;;;;;;                                                      ;;
  3. ;;;;;;;;;;;;;;;;;;;;;;;        SPRITER                    NAVI Dj.           ;;
  4. ;;;;;;;;;;;;;;;;;;;;;;;        ∙∙∙∙∙∙∙                    ∙∙∙∙∙∙∙∙           ;;
  5. ;;;;;;;;;;;;;;;;;;;;;;;                Usando  GRAPH v1.2                    ;;
  6. ;;;;;;;;;;;;;;;;;;;;;;;                                                      ;;
  7. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  8. .MODEL SMALL
  9. .STACK
  10. .386
  11.  
  12. .DATA
  13. FilePCX         DB  13 DUP (0)          ;  Nombre del fichero PCX.
  14. SprName         DB  13 DUP (0)          ;  Nombre del fichero de sprite.
  15. PVirtual        DB      0               ;  PV del PCX.
  16. Color           DB      0               ;  Color del rectángulo.
  17. CoorX1          DW      0
  18. CoorY1          DW      0
  19. CoorX2          DW      0
  20. CoorY2          DW      0               ;  Coordenadas del rectangulo.
  21. SizeX           DW      0
  22. SizeY           DW      0               ;  Tamaño X e Y del sprite.
  23. Sprite          DB      0               ;  Handle de sprite.
  24. Handle          DW      0               ;  Handle del fichero.
  25. ERROR           DB  ' ERROR: Debe indicar en la línea de comandos lo siguiente:',0Dh,0Ah
  26.                 DB  '          SPRITER  /Pnombre_pcx  /Snombre_spr  [/Ccolor]$'
  27. Msg1            DB  'Tamaño X: $'
  28. Msg2            DB  0Dh,0Ah,'Tamaño Y: $'
  29.  
  30. .CODE
  31. INCLUDE GRFLIB.INC
  32.  
  33. InicMouse       PROC                    ;  Resetea el ratón.
  34.                 XOR     AX, AX
  35.                 INT     33h
  36.                 MOV     AX, 1
  37.                 INT     33h
  38.                 MOV     AX, 0Fh
  39.                 MOV     CX, 8
  40.                 MOV     DX, 16
  41.                 INT     33h
  42.                 XOR     CX, CX
  43.                 MOV     DX, 319         ;  Tamaño X
  44.                 MOV     AX, 7
  45.                 INT     33h
  46.                 XOR     CX, CX
  47.                 MOV     DX, 199         ;  Tamaño Y
  48.                 MOV     AX, 8
  49.                 INT     33h
  50.                 RET
  51. InicMouse       ENDP
  52.  
  53. ShowMouse       PROC                    ;  Muestra el puntero del mouse.
  54.                 MOV     AX, 1
  55.                 INT     33h
  56.                 RET
  57. ShowMouse       ENDP
  58.  
  59. HideMouse       PROC                    ;  Quita el puntero del mouse.
  60.                 MOV     AX, 2
  61.                 INT     33h
  62.                 RET
  63. HideMouse       ENDP
  64.  
  65. AskMouse        PROC
  66.                 MOV     AX, 3           ;  Devuelve en BX los botones y en 
  67.                 INT     33h             ; CX,DX la posición X e Y.
  68.                 SHR     CX, 1
  69.                 RET
  70. AskMouse        ENDP
  71.  
  72. LineaCmds       PROC
  73.                 MOV     DI, 80h         ;  Apunta a la línea de comandos.
  74.                 XOR     CH, CH
  75.                 MOV     CL, ES:[DI]     ;  Cogemos la longitud.
  76.                 INC     DI
  77.                 MOV     [Color], 15     ;  Color predeterminado.
  78.  
  79.         @@BuscaCaracter:
  80.                 MOV     AL, ES:[DI]
  81.                 INC     DI
  82.                 CMP     AL, '/'
  83.                 JNE   @@BuscaCaracter
  84.                 CMP     DI, 0FFh
  85.                 JA    @@Final
  86.         @@Comando:
  87.                 MOV     AL, ES:[DI]
  88.                 INC     DI
  89.                 CMP     AL, 'P'         ;  Nombre del PCX.
  90.                 JE    @@PCXName
  91.                 CMP     AL, 'S'
  92.                 JE    @@SPRName
  93.                 CMP     AL, 'C'
  94.                 JNE   @@BuscaCaracter
  95.           @@Color:
  96.                 MOV     AL, ES:[DI]
  97.                 INC     DI
  98.                 SUB     AL, 30h
  99.                 JS    @@BuscaCaracter
  100.                 CMP     AL, 9
  101.                 JA    @@BuscaCaracter
  102.                 MOV     [Color], AL
  103.                 JMP   @@BuscaCaracter
  104.           @@SPRName:
  105.                 MOV     SI, Offset SPRName
  106.               @@BucleSPR:
  107.                 MOV     AL, ES:[DI]
  108.                 INC     DI
  109.                 CMP     AL, ' '
  110.                 JE    @@FinSPR
  111.                 PUSH    DI
  112.                 SUB     DI, CX
  113.                 SUB     DI, 2
  114.                 CMP     DI, 80h
  115.                 POP     DI
  116.                 JNB   @@FinSPR
  117.                 MOV     DS:[SI], AL
  118.                 INC     SI
  119.                 JMP   @@BucleSPR
  120.               @@FinSPR:
  121.                 MOV     BYTE PTR DS:[SI], 0
  122.                 JMP   @@BuscaCaracter
  123.           @@PCXName:
  124.                 MOV     SI, Offset FilePCX
  125.                 JMP   @@BucleSPR                ;  Es lo mismo.
  126.         @@Final:RET
  127. LineaCmds       ENDP
  128.  
  129. Word2Str        PROC                    ;  Recibe en AX la WORD a convertir.
  130.                 XOR     BX, BX
  131.         @@BucleW:
  132.                 XOR     DX, DX
  133.                 MOV     CX, 10
  134.                 DIV     CX
  135.                 PUSH    DX
  136.                 INC     BX
  137.                 OR      AX, AX
  138.                 JNZ   @@BucleW
  139.         @@BucleS:
  140.                 POP     AX
  141.                 ADD     AL, 30h
  142.                 MOV     AH, 0Eh
  143.                 PUSH    BX
  144.                 MOV     CX, 1
  145.                 XOR     BX, BX
  146.                 INT     10h
  147.                 POP     BX
  148.                 DEC     BX
  149.                 JNZ   @@BucleS
  150.                 RET
  151. Word2Str        ENDP
  152.  
  153. ;;;  F U N C I α N    P R I N C I P A L .
  154.  
  155. Spriter         PROC
  156.                 MOV     AX, @DATA
  157.                 MOV     DS, AX
  158.                 CALL    LiberaMEM
  159.                 CALL    ModoGrafico     ;  Encendemos GRAPH.
  160.                 CALL    TrataError
  161.  
  162.                 CALL    CreaVirtual     ;  Pedimos una PV.
  163.                 CALL    TrataError
  164.                 MOV     [PVirtual], AL
  165.                 CALL    LineaCmds       ;  Se lee la línea de comandos.
  166.                 PUSH    DS
  167.                 MOV     DX, Offset FilePCX
  168.                 MOV     AL, [PVirtual]
  169.                 CALL    LeePCX          ;  Leemos el fichero.
  170.                 CALL    TrataError
  171.                 POP     DS
  172.                 CMP     AL, 0FFh
  173.                 JE    @@Sacabou
  174.                 PUSH    AX
  175.                 MOV     AH, AL
  176.                 XOR     AL, AL
  177.                 XOR     BL, BL
  178.                 CALL    PonPaleta       ;  Inserta la paleta.
  179.                 CALL    TrataError
  180.                 POP     AX
  181.                 CALL    DestPaleta      ;  Libera memoria no utilizada.
  182.                 CALL    TrataError
  183.                 XOR     CX, CX
  184.                 MOV     DX, Offset SprName
  185.                 MOV     AX, 3C00h
  186.                 INT     21h             ;  Abre el fichero.
  187.                 JC    @@Sacabou
  188.                 MOV     [Handle], AX    ;  Guarda el handle.
  189.  
  190.                 MOV     AL, [PVirtual]
  191.                 XOR     AH, AH          ;  VGA
  192.                 CALL    CopiaPantalla   ;  Copiamos la pantalla a la VGA
  193.                 CALL    TrataError
  194.                 CALL    InicMouse
  195.         @@BuclePPal:
  196.                 CALL    AskMouse        ;  Pregunta a ver que esta pasando.
  197.                 OR      BX, BX
  198.                 JZ    @@BuclePPal       ;  Vuelve...
  199.                 CMP     BX, 2
  200.                 JE    @@SalvaSprite     ;  Graba el sprite.
  201.                 CMP     BX, 1
  202.                 JE    @@CogeCuadro      ;  Empieza a dibujar el rectangulo.
  203.                 CMP     BX, 3
  204.                 JNE   @@BuclePPal       ;  Vuelve...
  205.  
  206.           @@Finalizar:
  207.                 CALL    HideMouse
  208.                 MOV     AL, [PVirtual]
  209.                 CALL    DestVirtual     ;  Devuelve la memória.
  210.                 XOR     DX, DX
  211.                 MOV     CX, 8000h
  212.                 CALL    FadeDown        ;  Hace un fade.
  213.                 CALL    ModoTexto
  214.                 MOV     AH, 9
  215.                 MOV     DX, Offset Msg1
  216.                 INT     21h
  217.                 MOV     AX, [SizeX]
  218.                 CALL    Word2Str
  219.                 MOV     AH, 9
  220.                 MOV     DX, Offset Msg2
  221.                 INT     21h
  222.                 MOV     AX, [SizeY]
  223.                 CALL    Word2Str
  224.                 MOV     AX, 4C00h
  225.                 INT     21h             ;  Salir al DOS.
  226.  
  227.   @@Sacabou:    CALL    ModoTexto
  228.                 MOV     AH, 9
  229.                 MOV     DX, Offset ERROR
  230.                 INT     21h
  231.                 MOV     AX, 4C01h
  232.                 INT     21h
  233.  
  234.           @@SalvaSprite:
  235.                 MOV     BX, [CoorX1]
  236.                 MOV     SI, [CoorY1]
  237.                 MOV     DX, [CoorX2]
  238.                 MOV     DI, [CoorY2]
  239.                 MOV     AL, [PVirtual]
  240.                 CALL    GetImagen       ;  Coge el sprite.
  241.                 MOV     [Sprite], AL
  242.                 CALL    SegmentoSprite  ;  Nos devuelve el handle de sprite.
  243.                 MOV     AL, [Sprite]
  244.                 CALL    DestSprite      ;  Deja memoria libre.
  245.                 MOV     AX, [CoorX2]
  246.                 SUB     AX, [CoorX1]    ;  Calculamos la base del rectángulo.
  247.                 JNS   @@SignoOK1
  248.                 NEG     AX
  249.             @@SignoOK1:
  250.                 MOV     [SizeX], AX
  251.                 MOV     CX, [CoorY2]
  252.                 SUB     CX, [CoorY1]    ;  Calculamos la altura del rectángulo.
  253.                 JNS   @@SignoOK2
  254.                 NEG     CX
  255.             @@SignoOK2:
  256.                 MOV     [SizeY], CX
  257.                 PUSH    DS
  258.                 MOV     BX, [Handle]    ;  Cogemos el handle antes de cargar-
  259.                 PUSH    BX              ; nos BX.
  260.                 PUSH    ES
  261.                 POP     DS
  262.                 XOR     DX, DX          ;  S = b * h
  263.                 MUL     CX              ;  El resultado en AX, porque nunca
  264.                 POP     BX              ; puede en una pantalla de 320x200
  265.                 MOV     CX, AX          ; cogerse un sprite de más de un
  266.                 MOV     AH, 40h         ; segmento.
  267.                 INT     21h
  268.                 POP     DS
  269.                 MOV     BX, [Handle]
  270.                 MOV     AH, 3Eh
  271.                 INT     21h             ;  Cierra el fichero.
  272.                 JMP   @@Finalizar
  273.  
  274.           @@CogeCuadro:
  275.                 MOV     [CoorX1], CX
  276.                 MOV     [CoorY1], DX    ;  Guarda las coordenadas iniciales.
  277.             @@Bucle2:
  278.                 CALL    AskMouse
  279.                 PUSH    BX
  280.                 PUSH    CX
  281.                 PUSH    DX
  282.                 CALL    HideMouse
  283. ;                WaitVR
  284.                 MOV     AL, [PVirtual]
  285.                 XOR     AH, AH
  286.                 CALL    CopiaPantalla   ;  Cópia la pantalla virtual.
  287.                 MOV     DI, DX
  288.                 MOV     DX, CX
  289.                 MOV     BX, [CoorX1]
  290.                 MOV     SI, [CoorY1]
  291.                 MOV     CL, [Color]
  292.                 XOR     AL, AL
  293.                 CALL    Rectangulo      ;  Dibuja el rectángulo.
  294.                 CALL    ShowMouse
  295.                 POP     DX
  296.                 POP     CX
  297.                 POP     BX
  298.                 AND     BX, 1
  299.                 JNZ   @@Bucle2          ;  Seguir esperando.
  300.                 MOV     [CoorX2], CX
  301.                 MOV     [CoorY2], DX    ;  Guarda las coordenadas finales.
  302.                 JMP   @@BuclePPal
  303. Spriter         ENDP
  304.                 END     Spriter
  305.